//* API 基础地址
const BASE_URL = "https://your-api-base.com";

//Insterceptors： 存储拦截器的数组
let requestInterceptors = [];
let responseInterceptors = [];

//Insterceptors： 请求拦截器管理
const requestInterceptor = {
  use: (callback) => {
    requestInterceptors.push(callback);
  },
};

//Insterceptors： 响应拦截器管理
const responseInterceptor = {
  use: (callback) => {
    responseInterceptors.push(callback);
  },
};

/**
 *! 封装的基础请求函数
 */
export default async function request(options) {
  const url = `${BASE_URL}${options.url}`;

  /**
   * * ABIRT：自定义请求超时功能
   * * fetch 没有请求超时功能，
   * * 使用 AbortController 和 setTimeout 实现超时功能
   */
  const controller = new AbortController();

  // * ABIRT：自定义超时时间，默认10秒。
  const timeoutId = setTimeout(
    () => controller.abort(),
    options.timeout ?? 10000
  );
  const option = {
    method: options?.method || "GET",
    headers: {
      "Content-Type": "application/json",
      ...options.headers, // 合并自定义头部
    },
    signal: controller.signal,
  };

  // 为需要体的请求方法添加 body
  if (
    options.data &&
    (options.method === "POST" ||
      options.method === "PUT" ||
      options.method === "PATCH")
  ) {
    options.body = JSON.stringify(options.data);
  }

  try {
    const response = await fetch(url, option);

    // * ABIRT：清理定时器
    clearTimeout(timeoutId);

    // 检查响应是否成功 (状态码在200-299范围内)
    if (!response.ok) {
      throw new Error(`HTTP错误! 状态码: ${response.status}`);
    }

    //INFO 解析JSON响应
    switch (options.responseType) {
      case "json":
        return await response.json();
      case "text":
        return await response.text();
      case "blob":
        return await response.blob();
      case "formData":
        return await response.formData();
      default:
        return await response.json();
    }
  } catch (error) {
    // 统一处理错误，这里可以更精细地处理不同类型的错误
    console.error("请求失败:", error);
    throw error; // 重新抛出错误以便调用方处理
  }
}

//Insterceptors： 为封装的 Fetch 函数附加拦截器属性
request.interceptors = {
  request: requestInterceptor,
  response: responseInterceptor,
};
